<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    Promise.prototype.finally = function (callback) {
      console.log(this, 'this');
      debugger
      return this.then((data) => {
        // 让函数执行 内部会调用方法，如果方法是promise，需要等待它完成
        // 如果当前promise执行时失败了，会把err传递到，err的回调函数中
        return Promise.resolve(callback()).then(() => data); // data 上一个promise的成功态
      }, err => {
        return Promise.resolve(callback()).then(() => {
          throw err; // 把之前的失败的err，抛出去
        });
      })
    }
    // 情况1
    // let p2 = Promise.resolve(123).finally((data) => { // 这里传入的函数，无论如何都会执行
    //   console.log(data); // undefined
    // })
    // console.log(p2, 'p2');

    // 情况2 finally做中间处理
    // Promise.resolve(123).finally((data) => {
    //   console.log(data); // undefined
    // }).then(data => {
    //   console.log(data); // 123
    // })
    
    // 情况3
    // Promise.reject(123).finally((data) => {
    //   console.log(data); // undefined
    // }).then(data => {
    //   console.log(data);
    // }, err => {
    //   console.log(err, 'err'); // 123 err
    // })

    // 情况4 成功后，会等finally里面的promise执行完毕，把data传递给下一个.then
    Promise.resolve(123).finally((data) => {
      console.log(data); // undefined finally无法影响Promise.resolve(123)的结果，也拿不到这个里面的值
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('ok');
        }, 3000)
      })
    }).then(data => {
      console.log(data, 'success'); // 123 success
    }, err => {
      console.log(err, 'err');
    })
  </script>
</body>
</html>